﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using accesoDatos;
using clasesBase;
using Logica;

namespace PlanificacionProduccion
{
    public partial class FrmProductosDet : FrmABM
    {
        ManejadorAyudas ayuda = new ManejadorAyudas();
        List<int> idCaracteristicasBorrar = new List<int>();

        public FrmProductosDet()
        {
            InitializeComponent();
        }

        private void form_Load(object sender, System.EventArgs e)
        {
            if (base.idElemento != 0) mostrarDatos();
        }

        private void mostrarDatos()
        {
            Producto elem = new Producto(base.idElemento);

            txtId.Text = elem.ID.ToString();
            txtCodInterno.Text = elem.CodigoInterno.ToString();
            txtNombre.Text = elem.Nombre.Trim();
            txtDescripcion.Text = elem.Descripcion.Trim();
            txtEstuches.Text = elem.EstuchesPorCaja.ToString();

            mostrarCaracteristicasGrilla(elem.Caracteristicas);
        }

        private void btnGuardar_Click(object sender, System.EventArgs e)
        {
            quitarResaltado();
            if (camposCompletos())
            {
                if (Notificador.accionGuardarConfirmada())
                {
                    // Si se tratase de un elemento nuevo, el id correspondiente es 0.
                    int idElemento = txtId.Text.Trim() == "" ? 0 : Convert.ToInt32(txtId.Text);

                    Producto elem = new Producto(idElemento);
                    elem.Nombre = txtNombre.Text.Trim();
                    elem.Descripcion = txtDescripcion.Text.Trim();
                    elem.CodigoInterno = txtCodInterno.Text.Trim() != "" ? Convert.ToInt32(txtCodInterno.Text) : 0;
                    elem.Caracteristicas = obtenerCaracteristicas();
                    elem.EstuchesPorCaja = txtEstuches.Text.Trim() != "" ? Convert.ToInt32(txtEstuches.Text) : 0;

                    // Guardo la información
                    string error = elem.guardar();
                    if (error == "")
                    {
                        /* Si la actualización fue realizada correctamente, continúo. Se deben eliminar, si existiesen, 
                         * las características que se quisieron quitar */
                        foreach (int idElem in idCaracteristicasBorrar)
                        {
                            CaractLoteProducto caract = new CaractLoteProducto();
                            caract.ID = idElem;
                            error += " " + caract.borrarElemento();
                        }
                    }

                    Notificador.resultadoABM(idElemento == 0 ? TipoOperacionABM.ALTA : TipoOperacionABM.MODIFICACION, error);
                    if (error.Trim() == "") this.Close();
                }
            }
            else Notificador.camposNoCompletos();
        }

        private bool camposCompletos()
        {
            bool completos = true;

            if (txtCodInterno.Text.Trim() == "") { completos = false; lblCodInterno.ForeColor = Color.Red; }
            if (txtNombre.Text.Trim() == "") { completos = false; lblNombre.ForeColor = Color.Red; }
            if (txtDescripcion.Text.Trim() == "") { completos = false; lblDescripcion.ForeColor = Color.Red; }

            return completos;
        }

        private void quitarResaltado()
        {
            lblNombre.ForeColor = Color.Black;
            lblCodInterno.ForeColor = Color.Black;
            lblDescripcion.ForeColor = Color.Black;
        }

        private void txtCodInterno_KeyPress(object sender, KeyPressEventArgs e)
        {
            Validador.soloEnteros_KeyPress(sender, e);
        }

        #region Características
        private List<CaractLoteProducto> obtenerCaracteristicas()
        {
            List<CaractLoteProducto> items = new List<CaractLoteProducto>();
            foreach (DataGridViewRow fila in grillaCaracteristicas.Rows)
            {
                int idCaractProd = Convert.ToInt32(fila.Cells["colIdRelacion"].Value);
                CaractLoteProducto item = new CaractLoteProducto(idCaractProd);
                item.ObjCaracteristica = new CaracteristicaLote(Convert.ToInt32(fila.Cells["colIdCaracteristica"].Value));
                item.CantidadEstimada = fila.Cells["colCantidad"].Value.ToString();
                item.IdProducto = txtId.Text.Trim() == "" ? 0 : Convert.ToInt32(txtId.Text);

                items.Add(item);
            }

            return items;
        }

        private void mostrarCaracteristicasGrilla(List<CaractLoteProducto> items)
        {
            grillaCaracteristicas.Rows.Clear();
            foreach (CaractLoteProducto elem in items)
                grillaCaracteristicas.Rows.Add(elem.ID, elem.ObjCaracteristica.ID, elem.ObjCaracteristica.Nombre.Trim(), elem.CantidadEstimada, elem.ObjCaracteristica.ObjUnidadMedida.Nombre.Trim());
        }
        
        private void btnNuevoCaracteristicas_Click(object sender, EventArgs e)
        {
            limpiarCamposCaracteristicas();
        }

        private void limpiarCamposCaracteristicas()
        {
            txtCaracteristica.Text = "";
            txtIdCaracteristica.Text = "";
            txtCantidad.Text = "";
            lblUnidad.Text = "";
        }

        private void mostrarCaracteristicaSeleccionada()
        {
            DataGridViewRow filaSeleccionada = grillaCaracteristicas.CurrentRow;
            if (filaSeleccionada != null)
            {
                txtCaracteristica.Text = filaSeleccionada.Cells["colNombre"].Value.ToString();
                txtIdCaracteristica.Text = filaSeleccionada.Cells["colIdCaracteristica"].Value.ToString();
                txtCantidad.Text = filaSeleccionada.Cells["colCantidad"].Value.ToString();
                lblUnidad.Text = filaSeleccionada.Cells["colUnidad"].Value.ToString();
            }
        }

        private void btnAgregarCaracteristica_Click(object sender, EventArgs e)
        {
            int idCaracteristica = txtIdCaracteristica.Text.Trim() == "" ? 0 : Convert.ToInt32(txtIdCaracteristica.Text);
            string cantidad = txtCantidad.Text.Trim();
            string unidadMedida = lblUnidad.Text;
            if (idCaracteristica != 0)
            {
                string nombreCaracteristica = txtCaracteristica.Text.Trim();
                /* En primer lugar valido si ya se asoció al producto esa característica. Si así fuera, sólo modifico la
                 * cantidad. En otro caso, creo un renglón nuevo y le asigno los valores iniciales. */
                DataGridViewRow fila = obtenerFilaGrilla(grillaCaracteristicas, idCaracteristica);
                if (fila != null) // Ya existe en la grilla una fila con ese idCaracteristica
                    fila.Cells["colCantidad"].Value = cantidad;
                else grillaCaracteristicas.Rows.Add(0, idCaracteristica, nombreCaracteristica, cantidad, unidadMedida);

                limpiarCamposCaracteristicas();
            }
            else Notificador.camposNoCompletos();
        }

        private DataGridViewRow obtenerFilaGrilla(DataGridView grilla, int idBuscado)
        {
            string columnaBuscar = "colIdCaracteristica";

            DataGridViewRow fila;
            int indiceFilaBuscada = -1;
            for (int indiceFila = 0; indiceFila < grilla.Rows.Count; indiceFila++)
            {
                if ((int)grilla.Rows[indiceFila].Cells[columnaBuscar].Value == idBuscado)
                {
                    indiceFilaBuscada = indiceFila;
                    break;
                }
            }

            if (indiceFilaBuscada >= 0) fila = grilla.Rows[indiceFilaBuscada];
            else fila = null;

            return fila;
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            DataGridViewRow filaSeleccionada = grillaCaracteristicas.CurrentRow;
            if (filaSeleccionada != null)
            {
                if (Notificador.accionBorrarConfirmada())
                {
                    /* Confirmada la acción para borrar el elemento, guardo en primer lugar su id, ya que luego debería
                     * eliminarse en la tabla de la BD según corresponda. Si el id del elemento a borrarse es 0, no lo considero
                     * ya que se trata de un elemento nuevo y no existiría previamente para borrarlo. */
                    int id = Convert.ToInt32(grillaCaracteristicas.CurrentRow.Cells["colIdRelacion"].Value);
                    if (id != 0) idCaracteristicasBorrar.Add(id);

                    grillaCaracteristicas.Rows.RemoveAt(grillaCaracteristicas.CurrentRow.Index);
                }
            }
            else Notificador.elementoNoSeleccionado();
        }
        #endregion

        void txtCaracteristica_LostFocus(object sender, System.EventArgs e)
        {
            ayudaCaracteristicas(false);
        }

        private void ayudaCaracteristicas(bool todos)
        {
            if (!todos)
            {
                /* El evento ocurre a partir del elemento txtLocalidad. Valido antes de continuar, que haya algo escrito en localidad*/
                int id = txtIdCaracteristica.Text.Trim() == "" ? 0 : Convert.ToInt32(txtIdCaracteristica.Text);
                string caract = txtCaracteristica.Text.Trim();

                ayuda.mostrarElementos(CaracteristicaLote.tablaBD, id, caract, true);
            }
            else ayuda.mostrarElementos(CaracteristicaLote.tablaBD);

            mostrarDatosCaracteristica(ayuda.IdSeleccionado);
        }

        private void btnTodosMateria_Click(object sender, EventArgs e)
        {
            ayudaCaracteristicas(true);
        }

        private void mostrarDatosCaracteristica(int id)
        {
            CaracteristicaLote caract = new CaracteristicaLote(id);
            txtIdCaracteristica.Text = caract.ID.ToString();
            txtCaracteristica.Text = caract.Nombre.Trim();
            if (txtCantidad.Text.Trim().Equals("")) txtCantidad.Text = caract.CantidadEstimada.ToString();
            lblUnidad.Text = caract.ObjUnidadMedida.Nombre.Trim();
        }

        private void grillaCaracteristicas_DoubleClick(object sender, EventArgs e)
        {
            mostrarCaracteristicaSeleccionada();
        }
    }
}